# -*- coding: utf-8 -*-
# 工单编号：大数据 - 八维保险数据挖掘 - 07 - 人寿保险盈利能力
# 功能：人寿保险盈利能力指标计算与分析工具

import pandas as pd
import numpy as np
from tabulate import tabulate
from datetime import datetime, timedelta
import random
import matplotlib.pyplot as plt
import seaborn as sns
import os
from matplotlib.gridspec import GridSpec
import matplotlib.ticker as ticker

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'Microsoft YaHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False


class InsuranceProfitabilityAnalyzer:
    """
    人寿保险盈利能力分析工具
    功能：计算人寿保险核心盈利能力指标并输出表格和可视化图表
    """

    def __init__(self):
        # 保险指标解释库
        self.metric_explanations = {
            "净资产收益率(ROE)": "报告期净利润与所有者权益平均余额的比率，衡量股东权益回报率",
            "总资产收益率(ROA)": "报告期净利润与总资产平均余额的比率，衡量资产利用效率",
            "内含价值": "所有者权益 + 有效业务价值，反映寿险公司清算价值和未来盈利能力",
            "承保利润率": "承保利润与已赚保费的比率，反映保险公司承保业务直接盈利能力",
            "应收保费周转率": "原保费收入与应收保费平均余额的比率，衡量保费回收效率"
        }

        # 行业基准值
        self.industry_benchmarks = {
            "净资产收益率(%)": 10.5,
            "总资产收益率(%)": 1.2,
            "承保利润率(%)": 5.8,
            "应收保费周转率(%)": 8.0
        }

        # 生成模拟数据
        self.data = self.generate_sample_data()

        # 创建可视化文件夹
        self.visualization_folder = "保险盈利能力可视化"
        os.makedirs(self.visualization_folder, exist_ok=True)

    def generate_sample_data(self):
        """生成模拟的保险公司财务数据"""
        np.random.seed(42)
        institutions = ['北京分公司', '上海分公司', '广州分公司', '深圳分公司', '成都分公司']
        report_dates = [datetime(2025, 1, 31), datetime(2025, 2, 28), datetime(2025, 3, 31)]
        period_types = ['月报']

        data = []
        for date in report_dates:
            for institution in institutions:
                # 基础财务数据
                total_assets = random.uniform(1e8, 5e8)  # 总资产
                owner_equity = random.uniform(5e7, 2e8)  # 所有者权益
                net_profit = random.uniform(1e6, 1e7)  # 净利润
                earned_premium = random.uniform(5e6, 2e7)  # 已赚保费
                original_premium = random.uniform(6e6, 2.5e7)  # 原保费收入
                receivable_premium = random.uniform(1e5, 5e6)  # 应收保费余额
                effective_bv = random.uniform(1e7, 5e7)  # 有效业务价值
                total_premium = random.uniform(7e6, 3e7)  # 总保费
                ceded_premium = random.uniform(1e6, 5e6)  # 分出保费

                # 费用类数据
                claim_payout = random.uniform(3e6, 1e7)  # 赔付支出
                reinsurance_income = random.uniform(1e5, 5e5)  # 分保费用收入
                reinsurance_expense = random.uniform(5e4, 3e5)  # 分保费用支出
                commission_expense = random.uniform(5e5, 2e6)  # 手续费支出
                management_expense = random.uniform(1e6, 4e6)  # 管理费
                tax_expense = random.uniform(1e5, 5e5)  # 税金

                data.append({
                    "机构名称": institution,
                    "报告日期": date.strftime("%Y-%m-%d"),
                    "周期类型": random.choice(period_types),
                    "净利润": net_profit,
                    "总资产": total_assets,
                    "所有者权益": owner_equity,
                    "已赚保费": earned_premium,
                    "原保费收入": original_premium,
                    "应收保费余额": receivable_premium,
                    "有效业务价值": effective_bv,
                    "总保费": total_premium,
                    "分出保费": ceded_premium,
                    "赔付支出": claim_payout,
                    "分保费用收入": reinsurance_income,
                    "分保费用支出": reinsurance_expense,
                    "手续费支出": commission_expense,
                    "管理费": management_expense,
                    "税金": tax_expense
                })

        return pd.DataFrame(data)

    def calculate_metrics(self):
        """计算所有人寿保险盈利能力指标"""
        print("开始计算人寿保险盈利能力指标...")
        df = self.data.copy()

        # 按机构和日期排序，用于计算期初值
        df = df.sort_values(by=["机构名称", "报告日期"])

        # 计算期初值（上期数据）
        df['期初总资产'] = df.groupby('机构名称')['总资产'].shift(1)
        df['期初所有者权益'] = df.groupby('机构名称')['所有者权益'].shift(1)
        df['期初应收保费'] = df.groupby('机构名称')['应收保费余额'].shift(1)

        # 计算滚动12个月原保费收入
        df['滚动12月原保费'] = df.groupby('机构名称')['原保费收入'].transform(
            lambda x: x.rolling(window=12, min_periods=1).sum()
        )

        # 安全除法函数
        def safe_divide(a, b):
            return a / b if b != 0 else 0

        # 计算所有指标
        results = []
        for _, row in df.iterrows():
            # 1. 净资产收益率 (ROE)
            avg_equity = (row['期初所有者权益'] + row['所有者权益']) / 2
            roe = safe_divide(row['净利润'], avg_equity) * 100

            # 2. 总资产收益率 (ROA)
            avg_assets = (row['期初总资产'] + row['总资产']) / 2
            roa = safe_divide(row['净利润'], avg_assets) * 100

            # 3. 总资产周转率
            asset_turnover = safe_divide(row['已赚保费'], avg_assets) * 100

            # 4. 应收保费率
            receivable_ratio = safe_divide(row['应收保费余额'], row['滚动12月原保费']) * 100

            # 5. 应收保费周转率
            avg_receivable = (row['期初应收保费'] + row['应收保费余额']) / 2
            receivable_turnover = safe_divide(row['原保费收入'], avg_receivable) * 100

            # 6. 内含价值
            embedded_value = row['所有者权益'] + row['有效业务价值']

            # 7. 总资产增长率
            asset_growth = safe_divide((row['总资产'] - row['期初总资产']), row['期初总资产']) * 100

            # 8. 净资产增长率
            equity_growth = safe_divide((row['所有者权益'] - row['期初所有者权益']), row['期初所有者权益']) * 100

            # 9. 承保利润率
            underwriting_profit = (row['已赚保费']
                                   - row['赔付支出']
                                   + row['分保费用收入']
                                   - row['分保费用支出']
                                   - row['手续费支出']
                                   - row['管理费']
                                   - row['税金'])
            underwriting_margin = safe_divide(underwriting_profit, row['已赚保费']) * 100

            # 10. 自留保费占净资产比
            retained_premium = row['总保费'] - row['分出保费']
            retained_premium_ratio = safe_divide(retained_premium, avg_equity) * 100

            results.append({
                "机构名称": row['机构名称'],
                "报告日期": row['报告日期'],
                "净资产收益率(%)": roe,
                "总资产收益率(%)": roa,
                "总资产周转率(%)": asset_turnover,
                "应收保费率(%)": receivable_ratio,
                "应收保费周转率(%)": receivable_turnover,
                "内含价值(元)": embedded_value,
                "总资产增长率(%)": asset_growth,
                "净资产增长率(%)": equity_growth,
                "承保利润率(%)": underwriting_margin,
                "自留保费占净资产比(%)": retained_premium_ratio
            })

        self.results_df = pd.DataFrame(results)
        print("盈利能力指标计算完成！")
        return self.results_df

    def format_currency(self, x):
        """格式化货币值"""
        if abs(x) >= 1e8:
            return f"¥{x / 1e8:.2f}亿"
        elif abs(x) >= 1e4:
            return f"¥{x / 1e4:.2f}万"
        return f"¥{x:.2f}"

    def display_results(self):
        """以表格形式展示结果"""
        if not hasattr(self, 'results_df'):
            self.calculate_metrics()

        # 复制结果用于格式化
        display_df = self.results_df.copy()

        # 格式化货币值
        display_df['内含价值(元)'] = display_df['内含价值(元)'].apply(self.format_currency)

        # 设置显示选项
        pd.set_option('display.max_columns', None)
        pd.set_option('display.width', 1000)

        print("\n人寿保险盈利能力指标分析报告")
        print("=" * 100)

        # 按日期分组展示
        for date in display_df['报告日期'].unique():
            date_df = display_df[display_df['报告日期'] == date]
            print(f"\n报告期: {date}")
            print(tabulate(date_df, headers='keys', tablefmt='grid', showindex=False))

            # 添加行业基准比较
            print("\n指标对比行业基准:")
            print(f"  ROE行业基准: {self.industry_benchmarks['净资产收益率(%)']}%")
            print(f"  承保利润率行业基准: {self.industry_benchmarks['承保利润率(%)']}%")
            print("-" * 100)

    def explain_metric(self, metric_name):
        """解释保险指标的业务含义"""
        return self.metric_explanations.get(metric_name, "未找到该指标的解释")

    def export_to_excel(self, filename=f"人寿保险盈利能力分析_{datetime.now().strftime('%Y%m%d')}.xlsx"):
        """导出结果到Excel文件"""
        if not hasattr(self, 'results_df'):
            self.calculate_metrics()

        # 创建Excel写入器
        with pd.ExcelWriter(filename, engine='openpyxl') as writer:
            # 写入原始数据
            self.data.to_excel(writer, sheet_name='原始数据', index=False)

            # 写入计算结果
            self.results_df.to_excel(writer, sheet_name='盈利能力指标', index=False)

            # 添加指标解释
            explanations = pd.DataFrame({
                "指标名称": list(self.metric_explanations.keys()),
                "指标解释": list(self.metric_explanations.values())
            })
            explanations.to_excel(writer, sheet_name='指标解释', index=False)

            # 添加行业基准
            benchmarks = pd.DataFrame({
                "指标": list(self.industry_benchmarks.keys()),
                "行业基准值": list(self.industry_benchmarks.values())
            })
            benchmarks.to_excel(writer, sheet_name='行业基准', index=False)

        print(f"结果已导出到文件: {filename}")

    def analyze_by_metric(self, metric_name):
        """按指标进行分析"""
        if not hasattr(self, 'results_df'):
            self.calculate_metrics()

        # 获取指标数据
        metric_data = self.results_df[['机构名称', '报告日期', metric_name]]

        # 按机构计算平均值
        avg_by_institution = metric_data.groupby('机构名称')[metric_name].mean().reset_index()
        avg_by_institution.columns = ['机构名称', f'平均{metric_name}']

        # 按日期计算平均值
        avg_by_date = metric_data.groupby('报告日期')[metric_name].mean().reset_index()
        avg_by_date.columns = ['报告日期', f'平均{metric_name}']

        print(f"\n{metric_name}分析报告")
        print("=" * 60)
        print("\n按机构平均:")
        print(tabulate(avg_by_institution, headers='keys', tablefmt='grid', showindex=False))

        print("\n按报告期平均:")
        print(tabulate(avg_by_date, headers='keys', tablefmt='grid', showindex=False))

        # 对比行业基准
        if metric_name in self.industry_benchmarks:
            benchmark = self.industry_benchmarks[metric_name]
            overall_avg = metric_data[metric_name].mean()
            print(f"\n整体平均: {overall_avg:.2f}% | 行业基准: {benchmark}%")
            print(f"差异: {overall_avg - benchmark:.2f}个百分点")

        # 为该指标生成可视化图表
        self.visualize_single_metric(metric_name)

    def show_top_performers(self):
        """展示表现最佳的机构"""
        if not hasattr(self, 'results_df'):
            self.calculate_metrics()

        # 计算各机构平均ROE
        avg_roe = self.results_df.groupby('机构名称')['净资产收益率(%)'].mean().reset_index()
        avg_roe = avg_roe.sort_values('净资产收益率(%)', ascending=False)

        # 计算各机构平均承保利润率
        avg_margin = self.results_df.groupby('机构名称')['承保利润率(%)'].mean().reset_index()
        avg_margin = avg_margin.sort_values('承保利润率(%)', ascending=False)

        print("\n机构盈利能力排名")
        print("=" * 60)
        print("\n净资产收益率(ROE)排名:")
        print(tabulate(avg_roe, headers=['排名', '机构名称', '平均ROE(%)'],
                       tablefmt='grid', showindex=False))

        print("\n承保利润率排名:")
        print(tabulate(avg_margin, headers=['排名', '机构名称', '平均承保利润率(%)'],
                       tablefmt='grid', showindex=False))

        # 识别最佳机构
        best_roe = avg_roe.iloc[0]
        best_margin = avg_margin.iloc[0]
        print(f"\n最佳ROE机构: {best_roe['机构名称']} ({best_roe['净资产收益率(%)']:.2f}%)")
        print(f"最佳承保利润率机构: {best_margin['机构名称']} ({best_margin['承保利润率(%)']:.2f}%)")

        # 生成排名可视化
        self.visualize_top_performers(avg_roe, avg_margin)

    def visualize_metrics(self):
        """生成所有关键指标的可视化图表"""
        if not hasattr(self, 'results_df'):
            self.calculate_metrics()

        print("\n开始生成可视化图表...")

        # 设置机构颜色映射
        institution_colors = {
            '北京分公司': '#3498db',
            '上海分公司': '#2ecc71',
            '广州分公司': '#e74c3c',
            '深圳分公司': '#f39c12',
            '成都分公司': '#9b59b6'
        }

        # 1. 盈利能力指标对比（ROE和ROA）
        plt.figure(figsize=(14, 6))

        plt.subplot(1, 2, 1)
        sns.barplot(data=self.results_df, x='机构名称', y='净资产收益率(%)',
                    palette=institution_colors, estimator=np.mean)
        plt.axhline(y=self.industry_benchmarks['净资产收益率(%)'], color='r', linestyle='--',
                    label=f'行业基准: {self.industry_benchmarks["净资产收益率(%)"]}%')
        plt.title('各机构净资产收益率(ROE)对比')
        plt.ylabel('ROE(%)')
        plt.legend()

        plt.subplot(1, 2, 2)
        sns.barplot(data=self.results_df, x='机构名称', y='总资产收益率(%)',
                    palette=institution_colors, estimator=np.mean)
        plt.axhline(y=self.industry_benchmarks['总资产收益率(%)'], color='r', linestyle='--',
                    label=f'行业基准: {self.industry_benchmarks["总资产收益率(%)"]}%')
        plt.title('各机构总资产收益率(ROA)对比')
        plt.ylabel('ROA(%)')
        plt.legend()

        plt.tight_layout()
        plt.savefig(f"{self.visualization_folder}/1_盈利能力指标对比.png", dpi=300)

        # 2. 关键指标随时间变化趋势
        plt.figure(figsize=(14, 10))
        gs = GridSpec(2, 2, figure=plt.gcf())

        # ROE随时间变化
        ax1 = plt.subplot(gs[0, 0])
        for institution, color in institution_colors.items():
            inst_data = self.results_df[self.results_df['机构名称'] == institution]
            ax1.plot(inst_data['报告日期'], inst_data['净资产收益率(%)'],
                     label=institution, marker='o', color=color)
        ax1.axhline(y=self.industry_benchmarks['净资产收益率(%)'], color='r', linestyle='--')
        ax1.set_title('净资产收益率(ROE)随时间变化')
        ax1.set_ylabel('ROE(%)')
        ax1.legend()
        ax1.grid(True, linestyle='--', alpha=0.6)

        # 承保利润率随时间变化
        ax2 = plt.subplot(gs[0, 1])
        for institution, color in institution_colors.items():
            inst_data = self.results_df[self.results_df['机构名称'] == institution]
            ax2.plot(inst_data['报告日期'], inst_data['承保利润率(%)'],
                     label=institution, marker='s', color=color)
        ax2.axhline(y=self.industry_benchmarks['承保利润率(%)'], color='r', linestyle='--')
        ax2.set_title('承保利润率随时间变化')
        ax2.set_ylabel('承保利润率(%)')
        ax2.legend()
        ax2.grid(True, linestyle='--', alpha=0.6)

        # 资产增长率随时间变化
        ax3 = plt.subplot(gs[1, 0])
        for institution, color in institution_colors.items():
            inst_data = self.results_df[self.results_df['机构名称'] == institution]
            ax3.plot(inst_data['报告日期'], inst_data['总资产增长率(%)'],
                     label=institution, marker='^', color=color)
        ax3.set_title('总资产增长率随时间变化')
        ax3.set_ylabel('增长率(%)')
        ax3.legend()
        ax3.grid(True, linestyle='--', alpha=0.6)

        # 应收保费周转率随时间变化
        ax4 = plt.subplot(gs[1, 1])
        for institution, color in institution_colors.items():
            inst_data = self.results_df[self.results_df['机构名称'] == institution]
            ax4.plot(inst_data['报告日期'], inst_data['应收保费周转率(%)'],
                     label=institution, marker='d', color=color)
        ax4.axhline(y=self.industry_benchmarks['应收保费周转率(%)'], color='r', linestyle='--')
        ax4.set_title('应收保费周转率随时间变化')
        ax4.set_ylabel('周转率(%)')
        ax4.legend()
        ax4.grid(True, linestyle='--', alpha=0.6)

        plt.tight_layout()
        plt.savefig(f"{self.visualization_folder}/2_关键指标趋势分析.png", dpi=300)

        # 3. 内含价值分析
        plt.figure(figsize=(12, 8))

        # 内含价值分布饼图
        embedded_value = self.results_df.groupby('机构名称')['内含价值(元)'].sum()
        plt.pie(embedded_value, labels=embedded_value.index, autopct='%1.1f%%',
                colors=list(institution_colors.values()),
                wedgeprops={'edgecolor': 'white', 'linewidth': 1},
                startangle=90)
        plt.title('各机构内含价值分布')

        plt.tight_layout()
        plt.savefig(f"{self.visualization_folder}/3_内含价值分布.png", dpi=300)

        # 4. 指标相关性分析
        plt.figure(figsize=(14, 6))

        plt.subplot(1, 2, 1)
        sns.scatterplot(data=self.results_df, x='净资产收益率(%)', y='承保利润率(%)',
                        hue='机构名称', palette=institution_colors, s=100)
        plt.axvline(x=self.industry_benchmarks['净资产收益率(%)'], color='r', linestyle='--', alpha=0.5)
        plt.axhline(y=self.industry_benchmarks['承保利润率(%)'], color='r', linestyle='--', alpha=0.5)
        plt.title('净资产收益率与承保利润率关系')
        plt.grid(True, linestyle='--', alpha=0.6)

        plt.subplot(1, 2, 2)
        sns.scatterplot(data=self.results_df, x='应收保费周转率(%)', y='净资产收益率(%)',
                        hue='机构名称', palette=institution_colors, s=100)
        plt.axvline(x=self.industry_benchmarks['应收保费周转率(%)'], color='r', linestyle='--', alpha=0.5)
        plt.axhline(y=self.industry_benchmarks['净资产收益率(%)'], color='r', linestyle='--', alpha=0.5)
        plt.title('应收保费周转率与净资产收益率关系')
        plt.grid(True, linestyle='--', alpha=0.6)

        plt.tight_layout()
        plt.savefig(f"{self.visualization_folder}/4_指标相关性分析.png", dpi=300)

        # 5. 综合表现雷达图
        plt.figure(figsize=(10, 8))
        categories = ['净资产收益率(%)', '总资产收益率(%)', '承保利润率(%)',
                      '应收保费周转率(%)', '总资产增长率(%)', '自留保费占净资产比(%)']

        # 标准化数据 (0-1范围)
        radar_df = self.results_df.groupby('机构名称')[categories].mean().reset_index()
        for col in categories:
            min_val = radar_df[col].min()
            max_val = radar_df[col].max()
            radar_df[col] = (radar_df[col] - min_val) / (max_val - min_val) if max_val > min_val else 0.5

        N = len(categories)
        angles = [n / float(N) * 2 * np.pi for n in range(N)]
        angles += angles[:1]

        ax = plt.subplot(111, polar=True)
        ax.set_theta_offset(np.pi / 2)
        ax.set_theta_direction(-1)
        plt.xticks(angles[:-1], categories)
        ax.set_rlabel_position(0)
        plt.yticks([0.2, 0.4, 0.6, 0.8], ["0.2", "0.4", "0.6", "0.8"], color="grey", size=7)
        plt.ylim(0, 1)

        for idx, row in radar_df.iterrows():
            values = row[categories].values.flatten().tolist()
            values += values[:1]
            ax.plot(angles, values, linewidth=2, linestyle='solid',
                    label=row['机构名称'], color=institution_colors[row['机构名称']])
            ax.fill(angles, values, alpha=0.1, color=institution_colors[row['机构名称']])

        plt.title('各机构综合表现雷达图', size=16, y=1.1)
        plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))

        plt.tight_layout()
        plt.savefig(f"{self.visualization_folder}/5_综合表现雷达图.png", dpi=300)

        print(f"可视化图表已保存至 {self.visualization_folder} 文件夹")

    def visualize_single_metric(self, metric_name):
        """为单个指标生成可视化图表"""
        if not hasattr(self, 'results_df'):
            self.calculate_metrics()

        # 设置机构颜色映射
        institution_colors = {
            '北京分公司': '#3498db',
            '上海分公司': '#2ecc71',
            '广州分公司': '#e74c3c',
            '深圳分公司': '#f39c12',
            '成都分公司': '#9b59b6'
        }

        plt.figure(figsize=(12, 8))

        # 按机构平均值的条形图
        avg_by_institution = self.results_df.groupby('机构名称')[metric_name].mean().reset_index()
        avg_by_institution = avg_by_institution.sort_values(metric_name, ascending=False)

        plt.subplot(1, 2, 1)
        sns.barplot(data=avg_by_institution, x='机构名称', y=metric_name,
                    palette=institution_colors)

        # 添加行业基准线（如果存在）
        if metric_name in self.industry_benchmarks:
            plt.axhline(y=self.industry_benchmarks[metric_name], color='r', linestyle='--',
                        label=f'行业基准: {self.industry_benchmarks[metric_name]}')
            plt.legend()

        plt.title(f'各机构平均{metric_name}')
        plt.ylabel(metric_name)

        # 随时间变化趋势图
        plt.subplot(1, 2, 2)
        for institution, color in institution_colors.items():
            inst_data = self.results_df[self.results_df['机构名称'] == institution]
            plt.plot(inst_data['报告日期'], inst_data[metric_name],
                     label=institution, marker='o', color=color)

        # 添加行业基准线（如果存在）
        if metric_name in self.industry_benchmarks:
            plt.axhline(y=self.industry_benchmarks[metric_name], color='r', linestyle='--',
                        label=f'行业基准: {self.industry_benchmarks[metric_name]}')

        plt.title(f'{metric_name}随时间变化趋势')
        plt.ylabel(metric_name)
        plt.xticks(rotation=45)
        plt.legend()
        plt.grid(True, linestyle='--', alpha=0.6)

        plt.tight_layout()
        plt.savefig(f"{self.visualization_folder}/{metric_name}_分析.png", dpi=300)

    def visualize_top_performers(self, roe_data, margin_data):
        """可视化表现最佳的机构"""
        plt.figure(figsize=(14, 6))

        # ROE排名可视化
        plt.subplot(1, 2, 1)
        sns.barplot(data=roe_data, x='机构名称', y='净资产收益率(%)',
                    order=roe_data['机构名称'],
                    palette={
                        '北京分公司': '#3498db',
                        '上海分公司': '#2ecc71',
                        '广州分公司': '#e74c3c',
                        '深圳分公司': '#f39c12',
                        '成都分公司': '#9b59b6'
                    })
        plt.axhline(y=self.industry_benchmarks['净资产收益率(%)'], color='r', linestyle='--',
                    label=f'行业基准: {self.industry_benchmarks["净资产收益率(%)"]}%')
        plt.title('各机构平均净资产收益率(ROE)')
        plt.ylabel('ROE(%)')
        plt.legend()

        # 承保利润率排名可视化
        plt.subplot(1, 2, 2)
        sns.barplot(data=margin_data, x='机构名称', y='承保利润率(%)',
                    order=margin_data['机构名称'],
                    palette={
                        '北京分公司': '#3498db',
                        '上海分公司': '#2ecc71',
                        '广州分公司': '#e74c3c',
                        '深圳分公司': '#f39c12',
                        '成都分公司': '#9b59b6'
                    })
        plt.axhline(y=self.industry_benchmarks['承保利润率(%)'], color='r', linestyle='--',
                    label=f'行业基准: {self.industry_benchmarks["承保利润率(%)"]}%')
        plt.title('各机构平均承保利润率')
        plt.ylabel('承保利润率(%)')
        plt.legend()

        plt.tight_layout()
        plt.savefig(f"{self.visualization_folder}/6_最佳机构表现.png", dpi=300)


if __name__ == "__main__":
    # 初始化分析工具
    analyzer = InsuranceProfitabilityAnalyzer()

    print("=" * 60)
    print("人寿保险盈利能力分析工具")
    print("=" * 60)
    print(f"共加载 {len(analyzer.data)} 条财务数据记录")
    print(f"覆盖机构: {', '.join(analyzer.data['机构名称'].unique())}")
    print(f"报告期: {', '.join(analyzer.data['报告日期'].unique())}")

    # 计算指标并展示结果
    analyzer.calculate_metrics()
    analyzer.display_results()

    # 展示指标解释
    print("\n指标解释:")
    print(f"1. 净资产收益率(ROE): {analyzer.explain_metric('净资产收益率(ROE)')}")
    print(f"2. 内含价值: {analyzer.explain_metric('内含价值')}")

    # 分析关键指标
    analyzer.analyze_by_metric("净资产收益率(%)")
    analyzer.analyze_by_metric("承保利润率(%)")

    # 展示最佳机构
    analyzer.show_top_performers()

    # 生成所有可视化图表
    analyzer.visualize_metrics()

    # 导出到Excel
    analyzer.export_to_excel()

    print("\n分析完成！结果已保存到Excel文件")
    print(f"可视化图表已保存至 {analyzer.visualization_folder} 文件夹")